package optional;

import lombok.Data;
import org.junit.Test;

import java.text.DateFormat;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Optional的测试和使用
 * orElseGet 与 orElse 方法的区别在于，orElseGet 方法传入的参数为一个 Supplier 接口的实现
 * —— 当 Optional 中有值的时候，返回值；当 Optional 中没有值的时候，返回从该 Supplier 获得的值。
 */
public class UseOptional {

    @Test
    public void test01(){
        Person p = new Person();
        p.setName("陆捷旎");
        List<String> strings = Arrays.asList("睡觉", "游戏", "电影");//小彩蛋string不能插入数据
        strings.forEach(s -> {
            List<String> hobbys = Optional.ofNullable(p.getHobbys()).orElseGet(() -> {
                /*第一次肯定为空,就new一个*/
                List<String> list = new ArrayList<>();
                p.setHobbys(list);
                return list;
            });
            hobbys.add(s);
        });
        System.out.println(p.getHobbys());
    }

    /**
     * 判断是否有符合要求的数据
     */
    @Test
    public void test02(){
        List<Integer> list = Arrays.asList(1, 3, 5, 7);
        boolean present = list.stream().anyMatch(e -> e > 6);
        System.out.println(present);
    }

    /**
     * Optional.ofNullable(e).ifPresent 可以过滤为null的元素
     */
    @Test
    public void test03(){
       List<String> list = Arrays.asList("a", "b", "c", null);
       list.forEach(e->{
           Optional.ofNullable(e).ifPresent(item->{
               System.out.println(item);
           });
       });
    }

    // Optional + map + ifPresent 强无敌
    @Test
    public void test04(){
        Person person = new Person();
        //person.setHobbys(Arrays.asList("吃饭", "学习"));
        //person.setName("张三");
        //Optional.ofNullable(person).map(Person::getHobbys).ifPresent(System.out::println);


        Optional.ofNullable(person.getName()).ifPresent(e-> System.out.println(e));
    }

    /*
       如果ofNullable中的对象为空那么不会调用filter
     */
    @Test
    public void test05(){
        Person person = new Person();
        person.setName("lujieni");
        Person a = null;

        Person result = Optional.ofNullable(a).filter(e -> {
            if (Objects.equals("lujieni", e.getName())) {
                return true;
            }
            return false;
        }).orElseGet(() -> {
            Person p = new Person();
            p.setName("qiqi");
            return p;
        });
        System.out.println(result);
    }

    @Test
    public void test06(){
        Person person = new Person();
        person.getMap().put("lujieni", 24);
        Integer age = Optional.ofNullable(person.getMap()).map(e -> e.get("lujieni")).orElse(99);
        System.out.println(age);
    }

}

@Data
class Person{
    private String name;
    private List<String> hobbys;
    private Map<String, Integer> map = new HashMap<>();
}




